/**
 * e.g：
 *  @BindComponentMethodThis()
 *  class AComponent extends React.Component<any,any>{
 *      public onClick(){
 *          console.log(this);// => AComponent
 *      }
 *      public render(){
 *          // 不再需要 onClick = { this.onClick.bind(this) }
 *          return (<button onClick={this.onClick}>click</button>);
 *      }
 *  }
 * 
 */

import { BindMethodThis } from './BindMethodThis';
const lifecycleMethods = [
    'componentWillMount',
    'componentDidMount',
    'componentWillReceiveProps',
    'shouldComponentUpdate',
    'componentWillUpdate',
    'componentDidUpdate',
    'componentWillUnmount',
    'render'
];
/**
 * 绑定Component方法的this指向，已排除声明周期及render方法
 * 
 * @export
 * @param {Array<string>} [exclude=null] 不绑定this的方法
 * @returns
 */
export function BindComponentMethodThis(exclude: Array<string> = null) {
    var allExclued = lifecycleMethods.slice(0);
    if (exclude && (exclude.length > 0)) {
        // 这里无需对 exclude 数组去重，BindMethodThis 函数会执行去重
        allExclued = allExclued.concat(exclude);
    }
    return BindMethodThis(allExclued, false);
};
